home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / array.bas (.txt) < prev    next >
Encoding:
GW-BASIC  |  1984-11-11  |  10.9 KB  |  282 lines

  1. 10       KEY OFF: CLS: SCREEN 0,0,0: WIDTH 80
  2. 20       TWOPI = 2*3.14159
  3. 30       DIM RX(128),RY(128),G(128),USX(360),USY(360),XX(360),XY(360)
  4. 40       DIM GX(360),GY(360),GAIN(360),RXNORM(128),RYNORM(128)
  5. 50       LOCATE 3,15:PRINT  " *************************************************"
  6. 60       LOCATE 4,15:PRINT  " *             EVALUATION OF THE GAIN            *"
  7. 70       LOCATE 5,15:PRINT  " *                        OF                     *"
  8. 80       LOCATE 6,15:PRINT  " *             DISCRETE SENSOR ARRAYS            *"
  9. 90       LOCATE 7,15:PRINT  " *                                               *"
  10. 100      LOCATE 8,15:PRINT  " *  written: 3/27/83  last revision: 10/10/84    *"
  11. 110      LOCATE 9,15:PRINT  " *  by:   Donald L. Snyder                       *
  12. 120      LOCATE 10,15:PRINT " *        Department of Electrical Engineering   *"
  13. 130      LOCATE 11,15:PRINT " *        Washington University                  *"
  14. 140      LOCATE 12,15:PRINT " *        St. Louis, Missouri  63130             *"
  15. 150      LOCATE 13,15:PRINT " *                                               *"
  16. 160      LOCATE 14,15:PRINT " *  This program can be used to evaluate and     *"
  17. 170      LOCATE 15,15:PRINT " *  display the gain of up to 128 sensors in a   *"
  18. 180      LOCATE 16,15:PRINT " *  linear, circular, or user-defined planar     *"
  19. 190      LOCATE 17,15:PRINT " *  array.                                       *"
  20. 200      LOCATE 18,15:PRINT " *                                               *"
  21. 210      LOCATE 19,15:PRINT " *************************************************"
  22. 220      LOCATE 20,15:PRINT " *           STRIKE ANY KEY WHEN READY           *"
  23. 230      LOCATE 21,15:PRINT " *************************************************"
  24. 240      IF INKEY$ = "" THEN 240
  25. 250      CLS
  26. 260      LOCATE 8,20:PRINT "Options:"
  27. 270      LOCATE 10,20:PRINT "   1.  read program description"
  28. 280      LOCATE 11,20:PRINT "   2.  continue"
  29. 290      LOCATE 13,20:INPUT "Which option do you want";ANSWER
  30. 300      IF ANSWER=1 OR ANSWER=2 THEN GOTO 320
  31. 310              COLOR 14:LOCATE 15,17:PRINT "You must select 1 or 2.  Select again.":COLOR 7:GOTO 290
  32. 320      IF ANSWER=1 THEN GOSUB 2670
  33. 330      GOSUB 1310: REM to setup sine/cosine table for source angles
  34. 340      REM *****************************************************************
  35. 350      REM **** begin main program
  36. 360      GOSUB 430: REM to input selection
  37. 370      GOSUB 1190: REM to scale sensor locations by two*pi
  38. 380      GOSUB 1250: REM to input look angle
  39. 390      GOSUB 1380: REM to evaluate x(n), n=1,2,...,N
  40. 400      GOSUB 1450: REM to evaluate array gain
  41. 410      GOSUB 1630: REM to display subroutine
  42. 420      REM *****************************************************************
  43. 430      REM **** begin input selection subroutine
  44. 440      CLS: LOCATE 10,1
  45. 450      PRINT "The gain of the following arrays can be evaluated."
  46. 460      PRINT
  47. 470      PRINT "     1.  a linear array along vertical axis"
  48. 480      PRINT "     2.  a circular array"
  49. 490      PRINT "     3.  a user defined array"
  50. 500      PRINT: INPUT "Which array do you want evaluated"; ANSWER
  51. 510      IF ANSWER=1 OR ANSWER =2 OR ANSWER=3 THEN GOTO 530
  52. 520              COLOR 14:PRINT "You must select 1, 2, or 3.  Select again.": COLOR 7:GOTO 500
  53. 530      ON ANSWER GOSUB 730,850,980
  54. 540      CLS:LOCATE 10,1
  55. 550      INPUT "Do you want uniform shading (answer Y or N)";ANS$
  56. 560      IF ANS$ = "N" OR ANS$ = "n" OR ANS$ = "NO" OR ANS$ = "No" OR ANS$ = "no" THEN GOTO 610
  57. 570      FOR I = 1 TO N
  58. 580              G(I) = 1/N
  59. 590      NEXT I
  60. 600      RETURN: REM to main program
  61. 610      FOR I = 1 TO N
  62. 620              PRINT
  63. 630              PRINT "What is the gain for array element " I "?":INPUT G(I)
  64. 640      NEXT I
  65. 650      SUM=0
  66. 660      FOR I = 1 TO N
  67. 670              SUM = SUM + G(I)
  68. 680      NEXT I
  69. 690      FOR I = 1 TO N
  70. 700              G(I) = G(I)/SUM
  71. 710      NEXT I
  72. 720      RETURN: REM to main program
  73. 730      REM **** input for a linear array
  74. 740      CLS:LOCATE 10,1
  75. 750      PRINT "You have selected a linear array.  You must now specify the number"
  76. 760      PRINT "of array elements and the length of the array in wavelengths."
  77. 770      GOSUB 1110
  78. 780      PRINT:PRINT:INPUT "What is the length of the array in wavelengths";L
  79. 790      IF N=1 THEN D=0 ELSE D=L/(N-1)
  80. 800      FOR I = 1 TO N
  81. 810              RX(I) = 0
  82. 820              RY(I) = (I-1)*D
  83. 830      NEXT I
  84. 840      RETURN
  85. 850      REM **** input for a circular array
  86. 860      CLS:LOCATE 10,1
  87. 870      PRINT "You have selected a circular array.  You must now specify the number"
  88. 880      PRINT "of array elements and the radius of the array in wavelengths."
  89. 890      GOSUB 1110
  90. 900      PRINT:PRINT:INPUT "What is the radius of the array in wavelengths";RAD
  91. 910      D = TWOPI/N
  92. 920      FOR I = 1 TO N
  93. 930              THETA = D*(I-1)
  94. 940              RX(I) = RAD*COS(THETA)
  95. 950              RY(I) = RAD*SIN(THETA)
  96. 960      NEXT I
  97. 970      RETURN
  98. 980      REM **** input for a user selected array
  99. 990      CLS:LOCATE 10,1
  100. 1000      PRINT " You are to specify the array.  You must first specify the number"
  101. 1010      PRINT "of array elements and then their location."
  102. 1020      GOSUB 1110
  103. 1030      PRINT
  104. 1040      FOR I = 1 TO N
  105. 1050              CLS
  106. 1060              LOCATE 15,25:PRINT "For sensor " I
  107. 1070              LOCATE 16,25:INPUT "What is the x-location "; RX(I)
  108. 1080              LOCATE 17,25:INPUT "What is the y-location "; RY(I)
  109. 1090      NEXT I
  110. 1100      RETURN
  111. 1110      REM **** begin select number of array elements subroutine
  112. 1120      PRINT:PRINT "The number of elements must be an integer between or equal to 1 and 128."
  113. 1130      INPUT "What number of array elements do you want"; N
  114. 1140      FOR NTEST=1 TO 128
  115. 1150              IF NTEST=N GOTO 1180
  116. 1160      NEXT NTEST
  117. 1170      COLOR 14:PRINT:PRINT "The number must be an integer satisfying 1 =< N =< 128. Select again.":COLOR 7: GOTO 1130
  118. 1180      RETURN
  119. 1190     REM **** begin scale sensor locations by two*pi subroutine
  120. 1200     FOR I = 1 TO N
  121. 1210             RX(I) = RX(I)*TWOPI
  122. 1220             RY(I) = RY(I)*TWOPI
  123. 1230     NEXT I
  124. 1240     RETURN: REM to main program
  125. 1250     REM **** begin input look angle subroutine
  126. 1260     CLS:LOCATE 10,1
  127. 1270     INPUT "What look angle do you want (in degrees)";PHI
  128. 1280     PHIRAD = PHI*TWOPI/360: REM convert to radians
  129. 1290     ULX = COS(PHIRAD): ULY = SIN(PHIRAD)
  130. 1300     RETURN: REM to main program
  131. 1310     REM: **** begin source angle table subroutine
  132. 1320      LOCATE 15,1:PRINT:PRINT:COLOR 14:PRINT "        **********  WAIT WHILE SETTING UP SOURCE ANGLE TABLE  **********":COLOR 7
  133. 1330     FOR I = 1 TO 360
  134. 1340             THETA = (I-1)*TWOPI/360
  135. 1350             USX(I) = COS(THETA): USY(I) = SIN(THETA)
  136. 1360     NEXT I
  137. 1370     RETURN: REM to main program
  138. 1380     REM **** begin evaluate x(n) subroutine
  139. 1390     FOR I = 1 TO 360
  140. 1400             XX(I) = (ULX - USX(I))
  141. 1410             XY(I) = (ULY - USY(I))
  142. 1420     NEXT I
  143. 1430     PRINT XX(0) "     " XY(0)
  144. 1440     RETURN: REM to main program
  145. 1450     REM **** begin evaluation of array gain
  146. 1460     CLS:LOCATE 10,10:COLOR 14:PRINT "    **********  WAIT WHILE EVALUATING GAIN  **********":COLOR 7
  147. 1470     FOR I = 1 TO 360
  148. 1480             GX(I) = 0: GY(I) = 0
  149. 1490     NEXT I
  150. 1500     FOR I = 1 TO 360
  151. 1510             FOR J = 1 TO N
  152. 1520                     THETA = XX(I)*RX(J) + XY(I)*RY(J)
  153. 1530                     GX(I) = GX(I) + G(J)*SIN(THETA)
  154. 1540                     GY(I) = GY(I) + G(J)*COS(THETA)
  155. 1550             NEXT J
  156. 1560             GAIN(I) = SQR(GX(I)*GX(I)+GY(I)*GY(I))
  157. 1570     NEXT I
  158. 1580     FOR I = 1 TO 360
  159. 1590             GX(I) = GAIN(I)*USX(I)
  160. 1600             GY(I) = GAIN(I)*USY(I)
  161. 1610     NEXT I
  162. 1620     RETURN: REM to main program
  163. 1630     REM **** begin display subroutine
  164. 1640     CLS:LOCATE 10,1
  165. 1650     BEEP:BEEP
  166. 1660     PRINT "You can do the following."
  167. 1670     PRINT
  168. 1680     PRINT "    1.  display the array"
  169. 1690     PRINT "    2.  display the array gain"
  170. 1700     PRINT "    3.  select another look angle and reevaluate the array gain"
  171. 1710     PRINT "    4.  evaluate another array"
  172. 1720     PRINT "    5.  list x-coordinate, y-coordinate, and gain of each sensor"
  173. 1730     PRINT "    6.  list array gain as a function of source angle"
  174. 1740     PRINT "    7.  quit"
  175. 1750     PRINT:INPUT "Select your option (1, 2, 3, 4, 5, 6, or 7)", ANSWER
  176. 1760     FOR I=1 TO 7
  177. 1770             IF I = ANSWER THEN GOTO 1800
  178. 1780     NEXT I
  179. 1790     COLOR 14:PRINT:PRINT "You must select 1 to 7.  Select again.":COLOR 7: GOTO 1750
  180. 1800     ON ANSWER GOSUB 1820,2240,2640,2650,2450,2550,2890
  181. 1810     GOTO 1640
  182. 1820     REM **** begin display array subroutine
  183. 1830     CLS:SCREEN 2
  184. 1840     LOCATE 1,15:PRINT "SENSOR ARRAY GEOMETRY.  STRIKE ANY KEY TO CONTINUE."
  185. 1850     DELX = 40: DELY = 16.8
  186. 1860     FOR I = 1 TO 11
  187. 1870             X1 = 120 + (I-1)*DELX: Y1 = 16
  188. 1880             X2 = X1: Y2 = 184
  189. 1890             LINE (X1,Y1)-(X2,Y2)
  190. 1900     NEXT I
  191. 1910     FOR I = 1 TO 11
  192. 1920             X1 = 120: Y1 = 16 + (I-1)*DELY
  193. 1930             X2 = 520: Y2 = Y1
  194. 1940             LINE (X1,Y1)-(X2,Y2)
  195. 1950     NEXT I
  196. 1960     LINE (110,100)-(530,100): LINE (320,10)-(320,190)
  197. 1970     LOCATE 2,42:PRINT "1.0"
  198. 1980     LOCATE 14,67:PRINT "1.0":LOCATE 14,11:PRINT "-1.0"
  199. 1990     REM scale by distance to most distant sensor
  200. 2000     RMAXSQ = 0
  201. 2010     FOR I = 1 TO N
  202. 2020             RSQ = RX(I)*RX(I) + RY(I)*RY(I)
  203. 2030             IF RSQ > RMAXSQ THEN RMAXSQ = RSQ
  204. 2040     NEXT I
  205. 2050     RMAX = SQR(RMAXSQ)
  206. 2060     IF RMAX = 0 THEN GOTO 2170
  207. 2070     FOR I = 1 TO N
  208. 2080             RXNORM(I) = RX(I)/RMAX: RYNORM(I) = RY(I)/RMAX
  209. 2090     NEXT I
  210. 2100     LOCATE 8,70:PRINT "SCALE"
  211. 2110     LOCATE 9,70:PRINT "FACTOR"
  212. 2120     LOCATE 10,70:PRINT USING "##.##^^^^";RMAX/TWOPI
  213. 2130     LOCATE 17,70:PRINT "LOOK"
  214. 2140     LOCATE 18,70:PRINT "ANGLE"
  215. 2150     LOCATE 19,70:PRINT USING "###.##";PHI
  216. 2160     LOCATE 20,70:PRINT "DEGREES"
  217. 2170     FOR I = 1 TO N
  218. 2180             X = 320 + 200*RXNORM(I): Y = 100 - 83*RYNORM(I)
  219. 2190             CIRCLE (X,Y),5
  220. 2200     NEXT I
  221. 2210     IF INKEY$ = "" GOTO 2210
  222. 2220     CLS:SCREEN 0
  223. 2230     RETURN
  224. 2240     REM **** begin display array gain subroutine
  225. 2250     CLS:SCREEN 2
  226. 2260     LINE (90,100)-(550,100):LINE (320,10)-(320,190)
  227. 2270     LOCATE 1,17:PRINT "POLAR PLOT OF ARRAY GAIN. STRIKE ANY KEY TO CONTINUE."
  228. 2280     FOR I = 1 TO 5
  229. 2290             RAD = 40*I
  230. 2300             CIRCLE (320,100),RAD
  231. 2310     NEXT I
  232. 2320     LOCATE 14,67:PRINT "1.0"
  233. 2330     FOR I = 1 TO 360
  234. 2340             X = 320 + 200*GX(I)
  235. 2350             Y = 100 - 83*GY(I)
  236. 2360             PSET (X,Y),1
  237. 2370     NEXT I
  238. 2380     LOCATE 17,70:PRINT "LOOK"
  239. 2390     LOCATE 18,70:PRINT "ANGLE"
  240. 2400     LOCATE 19,70:PRINT USING "###.##";PHI
  241. 2410     LOCATE 20,70:PRINT "DEGREES"
  242. 2420     IF INKEY$ = "" GOTO 2420
  243. 2430     CLS:SCREEN 0
  244. 2440     RETURN
  245. 2450     REM **** begin list array parameters subroutine
  246. 2460     CLS: LOCATE 1,18:PRINT "LIST X-COORDINATE, Y-COORDINATE, AND GAIN OF EACH SENSOR"
  247. 2470     LOCATE 2,32: PRINT "PRESS ANY KEY WHEN READY."
  248. 2480     IF INKEY$ = "" GOTO 2480
  249. 2490     FOR I = 1 TO N
  250. 2500             PRINT I,"x= " RX(I)/TWOPI, "y= " RY(I)/TWOPI, "gain= " G(I)
  251. 2510     NEXT I
  252. 2520     PRINT: PRINT "PRESS ANY KEY TO CONTINUE."
  253. 2530     IF INKEY$ = "" GOTO 2530
  254. 2540     RETURN
  255. 2550     REM **** begin list array gain versus angle subroutine
  256. 2560     CLS:LOCATE 1,10:PRINT "ARRAY GAIN VERSUS ANGLE IN DEGREES.  PRESS ANY KEY WHEN READY."
  257. 2570     IF INKEY$ = "" GOTO 2570
  258. 2580     FOR I = 1 TO 360
  259. 2590             PRINT "angle= " I-1, "gain=" GAIN(I)
  260. 2600     NEXT I
  261. 2610     PRINT:PRINT "press any key to continue."
  262. 2620     IF INKEY$ = "" GOTO 2620
  263. 2630     RETURN
  264. 2640     GOTO 380
  265. 2650     GOTO 360
  266. 2670     CLS
  267. 2680     LOCATE 1,25:COLOR 14:PRINT "---  PROGRAM DESCRIPTION  ---":COLOR 7
  268. 2690     PRINT:PRINT
  269. 2700     PRINT "   The purpose of this program is to evaluate the gain of a"
  270. 2710     PRINT "planar array of omnidirectional sensors.  N sensors at locations"
  271. 2720     PRINT "r1, r2, ..., rN are assumed, where 1 <= N <= 128.  Larger values of N"
  272. 2730     PRINT "can be accommodated by a straightforward modification of the"
  273. 2740     PRINT "program.  The sensor at rn can be assigned a 'shading gain' gn."
  274. 2750     PRINT "The 'look angle' of the array is the direction for which its"
  275. 2760     PRINT "phasing yields the greatest sensitivity or gain.  The gain"
  276. 2770     PRINT "computed is:"
  277. 2780     PRINT
  278. 2790     PRINT "         G(theta) = |sum[gn exp(-jxn)|,"
  279. 2800     PRINT
  280. 2810     PRINT "where xn = 2(pi)<ul-u,rn>, ul is a unit vector in the look"
  281. 2820     PRINT "direction, theta Y.BAS   2176   A 05/17/84 08:47<UNK! {000D}><UNK! {000A}>MUSIC   .DOC   1664   A 09/20/83 20:37   DDATE   .COM    512   A 05/13/84 16:05<UNK! {000D}><UNK! {000A}>HOPPER  .BAS   4995   A 04/24/84 22:07   DOSEDIT .COM   2432   A 05/17/84 08:49<UNK! {000D}><UNK! {000A}>GUITAR  .BAS   1152   A 04/24/84 22:16   U-FORMAT.EXE  38656   A 06/08/84 13:38<UNK! {000D}><UNK! {000A}>123RANGE.BAS   6962   A 04/24/84 22:22   GROWTH  .TXT   2304   A 05/14/84 07:20<UNK! {000D}><UNK! {000A}>MUSIC   .BAS  14399   A 04/
  282.